/**
 * Copyright 2007-2008. Chongqing First Information & Network Co., Ltd. All
 * rights reserved. <a>http://www.cqfirst.com.cn</a>
 */
package com.cqcis.uip.base.framework.core;

import java.util.Collection;
import java.util.Map;

import org.osgi.framework.BundleContext;

import com.cqcis.uip.base.framework.common.Attributes;
import com.cqcis.uip.base.framework.common.Role;
import com.cqcis.uip.base.framework.common.Task;
import com.cqcis.uip.base.framework.common.TaskRecord;
import com.cqcis.uip.base.framework.common.TrafficMask;
import com.cqcis.uip.base.logadaptor.LogConfiguration;


/**
 * 描述一个可以运行、停止, 具有完整生命周期，可以执行task、可以被监控的服务,是接口平台的核心
 * 
 * @author huangmy
 * @date   2008-1-10
 */
public interface RegisteredService extends TrafficMask, Service {
	/**
	 * 向服务提交任务, 如果提交失败, 必须返回 false 或者抛出异常; 
	 *                  提交成功, 必须返回true
	 *                  
	 * @param task
	 * @return
	 * @throws Exception
	 */
    public boolean schedule(final Task task) throws Exception;
    
    /**
     * 提交cluster类型值
     * 
     * @param obj
     * @throws Exception
     */
    public boolean scheduleCluster(final Object obj) throws Exception;
        
    /**
     * 同步
     * 
     * @param task
     * @return
     * @throws Exception
     */
    public boolean scheduleSync(final Task task) throws Exception;
    
    /**
	 * 如果{@link RegisteredService#schedule(Task)}}为异步, 则有必要实现该方法。
	 * 收集异步错误任务。如工单处理错误, 远程服务器无法连接等等
	 * @return
	 */
	public Task scheduleResult();
	    
    /**
     * 处理任务结果
     * 
     * @param result
     * @return
     */
    public boolean processResult(Task task);
    
    /**
     * 默认的线程池配置
     * 
     * @return
     */
    public ThreadPoolConfig getDefaultThreadPoolConfig();
    	
	/**
	 * 获取属性
	 * 
	 * @return
	 */
	public Attributes<Object> getAttributes();
	
	/**
	 * 获取服务所挂接的端点
	 * 
	 * @return
	 */
	public Collection<Endpoint> getEndpoints();
	
	/**
	 * 日志目录
	 * 
	 * @return
	 */
	public LogConfiguration getLogConfiguration();	
	
	/**
	 * 注册服务名称
	 * 
	 * @return
	 */
	public String getName();
	
	/**
	 * 注册服务ID
	 * 
	 * @return
	 */
	public String getId();
	
	/**
	 * OSGI 对应的Bundle上下文
	 * 
	 * @return
	 */
	public BundleContext getBundleContext();
	
	/**
	 * 所属角色
	 * 
	 * @return
	 */
	public Role getRole();
	
	/**
	 * 任务处理记录
	 * 
	 * @return
	 */
	public TaskRecord getTaskRecord();
	
	/**
	 * 流量控制队列长度大小
	 * 
	 * @return
	 */
	public int getWaitTaskMax();
	
	/**
	 * 上下文
	 * 
	 * @return
	 */
	public RegisteredServiceContext  getRegisteredServiceContext();
	
	/**
	 * 是否有未决任务提交
	 * 
	 * @return
	 */
	public boolean hasPendingSchedule();
	
	/**
	 * 捕获到异常
	 * 
	 * @param t
	 */
	public void catchException(Task task, Throwable t);
	
	/**
	 * 未决发送的task数量
	 * 
	 * @return
	 */
	public int getPendingSendTaskSize();
	
	/**
	 * 未完成的task，即没有返回result的task
	 * 
	 * @return
	 */
	public Map<String, Task> getNoResultTasks();
	
	/**
	 * 当前类加载器
	 * 
	 * @return
	 */
	public ClassLoader getClassLoader();
}
